#include "i2c-board.h"
#include "tremo_gpio.h"
#include "tremo_rcc.h"
#include "tremo_delay.h"
#include "system.h"


#if defined(CONFIG_DTU_AI)	


void I2C_init(void)
{
    rcc_enable_peripheral_clk(SYSTEM_I2C_CLK_RCC, true);
    gpio_init(SYSTEM_I2C_CLK_GPIO, SYSTEM_I2C_CLK_PIN, GPIO_MODE_OUTPUT_PP_HIGH);
    gpio_set_iomux(SYSTEM_I2C_CLK_GPIO, SYSTEM_I2C_CLK_PIN, 0); 
    
    rcc_enable_peripheral_clk(SYSTEM_I2C_SDA_RCC, true);
    gpio_init(SYSTEM_I2C_SDA_GPIO, SYSTEM_I2C_SDA_PIN, GPIO_MODE_OUTPUT_PP_HIGH);
    gpio_set_iomux(SYSTEM_I2C_SDA_GPIO, SYSTEM_I2C_SDA_PIN, 0); 

    I2C_CLK_OUT_HIGH();
    I2C_SDA_OUT_HIGH();
}
    

//产生IIC起始信号
void IIC_Start(void)
{
	I2C_CLK_OUT_MODE();     //sda输出
	I2C_SDA_OUT_HIGH();	  	  
	I2C_CLK_OUT_HIGH();
	delay_us(4);
 	I2C_SDA_OUT_LOW();		//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	I2C_CLK_OUT_LOW();		//钳住I2C总线，准备发送或接收数据 
}	  

//产生IIC停止信号
void IIC_Stop(void)
{
	I2C_CLK_OUT_MODE();		//sda线输出
	I2C_CLK_OUT_LOW();
	I2C_SDA_OUT_LOW();		//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	I2C_CLK_OUT_HIGH(); 
	I2C_SDA_OUT_HIGH();		//发送I2C总线结束信号
	delay_us(4);							   	
}


//等待应答信号到来
//返回值：1，接收应答失败
//        0，接收应答成功
uint8_t IIC_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	I2C_SDA_IN_MODE() ;     //SDA设置为输入  
	I2C_SDA_OUT_HIGH();
    delay_us(1);	   
	I2C_CLK_OUT_HIGH();
    delay_us(1);	 
	while(I2C_SDA_READ())
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	I2C_CLK_OUT_LOW();		//时钟输出0 	  
	return 0;  
} 

//产生ACK应答	 
void IIC_Ack(void)
{
	I2C_CLK_OUT_LOW();
	I2C_CLK_OUT_MODE();
	I2C_SDA_OUT_LOW();
	delay_us(2);
	I2C_CLK_OUT_HIGH();
	delay_us(2);
	I2C_CLK_OUT_LOW();
}


//不产生ACK应答	   
void IIC_NAck(void)
{
	I2C_CLK_OUT_LOW();
	I2C_CLK_OUT_MODE();
	I2C_SDA_OUT_HIGH();
	delay_us(2);
	I2C_CLK_OUT_HIGH();
	delay_us(2);
	I2C_CLK_OUT_LOW();
}					 				     


//IIC发送一个字节
//返回从机有无应答
//1，有应答
//0，无应答		  
void IIC_Send_Byte(uint8_t txd)
{                        
    uint8_t t;   
	I2C_CLK_OUT_MODE(); 	    
    I2C_CLK_OUT_LOW();				//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {  
        if((txd&0x80)>>7)       
        {
            I2C_SDA_OUT_HIGH();
        }  
        else
        {
            I2C_SDA_OUT_LOW();
        }   
        txd<<=1; 	  
		delay_us(2);   
		I2C_CLK_OUT_HIGH();
		delay_us(2); 
		I2C_CLK_OUT_LOW();	
		delay_us(2);
    }	 
} 	    


//读1个字节，ack=1时，发送ACK，ack=0，发送nACK   
uint8_t IIC_Read_Byte(uint8_t ack)
{
	unsigned char i,receive=0;
	I2C_SDA_IN_MODE() ;				//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        I2C_CLK_OUT_LOW(); 
        delay_us(2);
		I2C_CLK_OUT_HIGH();
        receive<<=1;
        if(I2C_SDA_READ())receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();					//发送nACK
    else
        IIC_Ack(); 					//发送ACK   

    return receive;
}


#endif


